package com.monolithiot.sso.service;

import com.monolithiot.sso.common.entity.DeviceAuthorization;
import com.monolithiot.sso.common.entity.User;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 2018/12/22 Create by 郭文梁
 * DeviceAuthorizationService
 * 设备授权业务行为定义
 *
 * @author 郭文梁
 * @date 2018/12/22
 */
public interface DeviceAuthorizationService extends BaseService<DeviceAuthorization> {
    /**
     * 授权方法
     *
     * @param user         用户
     * @param expireIn     授权时间
     * @param deviceType   设备类型
     * @param serialNumber 设备序列号
     * @return DeviceAuthorization Entity
     */
    @NotNull
    DeviceAuthorization auth(User user, int expireIn, Integer deviceType, String serialNumber);

    /**
     * 通过设备类型和Token查找授权，同时附带用户信息
     *
     * @param deviceType 设备类型
     * @param token      令牌
     * @return DeviceAuthorization entity(with User entity)
     */
    DeviceAuthorization findByDeviceTypeAndTokenWithUser(Integer deviceType, String token);

    /**
     * 删除过期的授权
     *
     * @return 上出的数据数量
     */
    int deleteOverdue();

    /**
     * 通过令牌查找授权
     *
     * @param token 令牌
     * @return 授权对象
     */
    DeviceAuthorization findByToken(String token);

    /**
     * 设置授权名称
     *
     * @param token 令牌
     * @param name  名称
     * @return DeviceAuthorization
     */
    DeviceAuthorization setName(String token, String name);

    /**
     * 通过用户查找设备授权
     *
     * @param user 用户
     * @return 设备授权列表
     */
    List<DeviceAuthorization> findByUser(User user);

    /**
     * 通过用户查找设备授权 同时抓取出关联属性
     *
     * @param user 用户对象 NotNull
     * @return DeviceAuthorization List
     */
    List<DeviceAuthorization> findByUserFetchAll(User user);
}
